Aller au contenu

Programmation/Make

Un livre de Wikilivres.

En programmation, make est, entre autres, un outil pour compiler de grandes applications. C'est un moteur de production principalement pour travailler dans un langage compilé sous environnement Unix.

make est fourni par défaut sur Ubuntu. Sinon :

sudo apt install make

Dans Powershell en admin :

 Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
 choco install make

Ensuite cela fonctionne à peu près comme sur Linux, nonobstant la nécessité de préfixer certaines commandes par "start ".

En langage C, l'utilisation basique est :

make exo7

cela remplace :

cc exo7.c -o exo7

Son principal avantage et ce pourquoi il fut imaginé est de simplifier grandement le travail du programmeur. Lorsque l'on compile un programme utilisant de nombreuses bibliothèques comme pour l'utilisation d'interfaces graphiques par exemple :

gcc -o exo5 exo5.c -L/usr/X11R6/lib -lglut -lGLU -lGL -lX11 -lXmu -lXext -lXi -lm

On aura besoin de directives indiquant que l'on compilera avec cette longue ligne de bibliothèques, ces directives sont enregistrés dans un fichier texte toujours nommé Makefile.

La commande make et fichier ASCII Makefile (M majuscule) vont toujours de pair. Makefile se trouvant dans le répertoire ou l'on exécute make.

Structure du Makefile

[modifier | modifier le wikicode]
# Les lignes de commentaires commencent par dièse
VARIABLE=valeur
 cible: dépendances
<TABULATION>commande 1
	    commande 2
             .
             .
             .
	    commande n

Exemple de Makefile

[modifier | modifier le wikicode]

Un Makefile commun est :

 all: helloworld
 
 helloworld: helloworld.c
	cc -o helloworld helloworld.c
 clean:
	rm -f helloworld

En exécutant make en ligne de commande dans le répertoire où se trouve le Makefile nous avons :

$ ls
helloworld.c  Makefile
$ make
cc -o helloworld helloworld.c
$ ls
helloworld  helloworld.c  Makefile
$ make clean
rm -f helloworld
$ ls
helloworld.c  Makefile
$ make all
cc -o helloworld helloworld.c
$

Il est possible de définir des variables dans un makefile. Ces variables sont très souvent utilisées pour définir le compilateur utilisé, les options de compilation, les chemins vers les bibliothèques, et autres variables spécifiques à l'environnement de l'utilisateur. Par exemple, on utilisera :

TARGET=helloworld
CC=cc
CFLAGS=-O2 -g

$(TARGET): $(TARGET).c
  $(CC) $(CFLAGS) -o $(TARGET) $(TARGET).c

Il existe aussi des variables magiques comme :

$@ : le nom de la cible courante.
$< : le fichier source de la dépendance

Le précédent Makefile se simplifie en :

# Nom de l'exécutable
TARGET=helloworld

# Variables d'environnement
CC=cc
CFLAGS=-O2 -g
RM=rm -f

# Définition des règles de compilation
 all: $(TARGET)
 
 $(TARGET): $(TARGET).c
	$(CC) $(CFLAGS) -o $@ $<

 clean:
	$(RM) $(TARGET)

Il existe une cible réservée nommée .PHONY qui force les dépendances à se reconstruire.